package com.yanxu.design01_singleton.lazy;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/4/9-2025
 * @Description: 双重检查实现 懒加载单例模式
 */
public class Lazy03_DoubleCheckSingleton2 {
    //声明
    //注意使用  volatile 关键字进行修饰，禁止重排序
    private static volatile Lazy03_DoubleCheckSingleton2 instance = null;

    /* 构造方法私有化 */
    private Lazy03_DoubleCheckSingleton2() {
    }

    public static Lazy03_DoubleCheckSingleton2 getInstance() {
        //第一次检查
        if (instance == null) {
            synchronized (Lazy03_DoubleCheckSingleton2.class) {
                //第二次检查
                if (instance == null) {
                    instance = new Lazy03_DoubleCheckSingleton2();
                    /*
                     * 在  instance=new LazyDoubleCheckSingleton(); 这个过程，要经历三个步骤
                     * 1. 在堆内存中开辟空间
                     * 2. 初始化这个对象
                     * 3. 设置 instance 指向刚才分配的内存地址
                     *
                     * 这三个步骤中，在默认的情况下是可能发生重排序的，
                     * 但是，因为 instance 使用 volatile 关键字进行了修饰，禁止重排序。
                     * */
                }
            }
        }
        return instance;
    }
}